=x= 🌵 Yachts 前台頁面 Specification - Content Page 後端功能製作。
📌 Specification 內容區塊的重點會是所有型號細節全部存在同一張表,需使用型號 GUID 來比對型號的 ID,標題也要用 ID 來比對,然後相同細節的標題只會出現一次,沒有細節的標題不會出現,實作會介紹如何使用精靈來幫助產出 SQL 語法。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
loadContent();
}
}
👀 MSSQL 參考操作 : SQL語法-表與表之間的關係 Join 也可使用小精靈產生Join
🌵 下面執行時會增加 GUID 做為篩選條件。
private void loadContent()
{
string guidStr = Session["guid"].ToString();
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TayanaYachtConnectionString"].ConnectionString);
string sql = "SELECT Yachts.guid, Specification.detail, DetailTitleSort.detailTitleSort"
+ " FROM DetailTitleSort INNER JOIN"
+ " Specification ON DetailTitleSort.id = Specification.detailTitleSort_ID INNER JOIN"
+ " Yachts ON Specification.yachtModel_ID = Yachts.id WHERE Yachts.guid = @guidStr";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@guidStr", guidStr);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
StringBuilder detailHtmlStr = new StringBuilder();
//用於檢查 Title 是否相同
string checkTitle = "";
while (reader.Read()) {
string detailTitle = reader["detailTitleSort"].ToString();
//需使用 HtmlDecode ,因為存入時有使用 HtmlEncode 轉換換行用標籤 <br>
string detailStr = HttpUtility.HtmlDecode(reader["detail"].ToString());
// 加入第一個標題,並更新檢查用變數
if (String.IsNullOrEmpty(checkTitle)) {
detailHtmlStr.Append($"<p>{detailTitle}</p><ul>");
checkTitle = detailTitle;
}
// Title 不相同時就更新確認用變數並加入 Title 的 HTML 語法
else if (!checkTitle.Equals(detailTitle)) {
checkTitle = detailTitle;
detailHtmlStr.Append($"</ul><p>{detailTitle}</p><ul>");
}
detailHtmlStr.Append($"<li>{detailStr}</li>");
}
connection.Close();
//結束 HTML 字串並渲染畫面
detailHtmlStr.Append($"</ul>");
ContentHtml.Text = detailHtmlStr.ToString();
}
🌵 使用 MSSQL 精靈產生的語法並加上篩選條件WHERE Yachts.guid = @guidStr
。
🌵 SQL 語法換行記得不要漏掉空格。
📢 今天的內容原本是寫成 3 個 SQL 命令去分別執行,後來才改成這樣,順便介紹用精靈來協助產生 SQL 的 JOIN 語法,比較需要思考一下的地方是,標題迴圈的邏輯,可以都不管列表的解尾標籤 </ul>
,頁面還是可以正常渲染,不過還是用完整的方式寫出來了。